package com.yupi.yupicturebackend.exception;

import lombok.Getter;

/**
 * 自定义业务异常类。
 * 一般不建议直接抛出Java内置的RuntimeException，而是自定义一个业务异常，
 * 和内置的异常类区分开，便于定制化输出错误信息。
 * 使用此异常可以在不同的业务场景中传递特定的错误码和错误消息。
 */
@Getter // Lombok注解，自动生成所有属性的getter方法。
public class BusinessException extends RuntimeException {

    /**
     * 错误码，用于标识具体的错误类型。
     * 可以根据错误码进行不同类型的错误处理或显示特定的错误信息给用户。
     */
    private final int code;

    /**
     * 构造函数，接受错误码和错误消息。
     *
     * @param code 错误码，用来标识错误类型。
     * @param message 错误消息，描述错误的具体信息。
     */
    public BusinessException(int code, String message) {
        // 调用父类（RuntimeException）构造函数，设置错误消息。
        super(message);
        // 设置错误码。
        this.code = code;
    }

    /**
     * 构造函数，接受一个ErrorCode枚举对象。
     * ErrorCode通常包含错误码和对应的错误消息。
     *
     * @param errorCode 包含错误码和错误消息的枚举对象。
     */
    public BusinessException(ErrorCode errorCode) {
        // 调用父类构造函数，使用ErrorCode中的错误消息。
        super(errorCode.getMessage());
        // 设置错误码为ErrorCode中的值。
        this.code = errorCode.getCode();
    }

    /**
     * 构造函数，接受一个ErrorCode枚举对象和自定义的错误消息。
     * 这允许在使用预定义的ErrorCode的同时，提供更加具体或上下文相关的错误消息。
     *
     * @param errorCode 包含错误码和默认错误消息的枚举对象。
     * @param message 自定义的错误消息，覆盖ErrorCode中的默认消息。
     */
    public BusinessException(ErrorCode errorCode, String message) {
        // 调用父类构造函数，使用传入的自定义错误消息。
        super(message);
        // 设置错误码为ErrorCode中的值。
        this.code = errorCode.getCode();
    }
}